//
//  TGMListModel.h
//  TravelGuideMdd
//
//  Created by BigPolarBear on 3/3/14.
//  Copyright (c) 2014 mafengwo.com. All rights reserved.
//

#import "TGMBaseModel.h"



/* 列表型数据Model
 
 默认：直接网络数据接口缓存
 默认：支持分页
 
 */

@interface TGMListModel : TGMBaseModel

#pragma mark 添加删除观察者
/** 添加观察者 */
+ (void)addDataObserver:(id<MFWDataObserver>)anObserver;
/** 删除观察者 */
+ (void)removeDataObserver:(id<MFWDataObserver>)anObserver;


#pragma mark ------ UI层用于分页获取数据
/** 取列表数据（首页），例如： 
 MFWHttpTask task = [model requestRefresh:[model actionDataXXX]];
 */
- (MFWHttpTask*)requestRefresh:(TGMBaseModelActionData*)data;


//获取列表数据Block 回调网络请求
-(MFWHttpTask *)requestRefresh:(TGMBaseModelActionData*)data
                    completion:(void(^)(BOOL success, NSArray *items,NSString* errorMsg))completion;

/** 取列表数据（下页）,例如：
 MFWHttpTask task = [model requestGetMore:[model actionDataXXX]];
 */
- (MFWHttpTask*)requestGetMore:(TGMBaseModelActionData*)data;


-(MFWHttpTask *)requestGetMore:(TGMBaseModelActionData*)data
                    completion:(void(^)(BOOL success, NSArray *items,NSString* errorMsg))completion;

/** 指定dataId取数据，例如：
 NSArray* itemArray = [model listModelItemForDataId:[model dataIdXXX]];
 */
- (NSArray*)listModelItemForDataId:(NSString *)dataId;

/**
 *	是否可以获取更多，只有当数据取完或者当前数据没有成功刷新过时返回NO，
 *
 *	@param	dataId	dataId
 *
 *	@return
 */
- (BOOL)canGetMoreForDataId:(NSString*)dataId;
/** 此dataId的总数（一直取更多所能取到的记录总数） */
- (NSNumber*)totalForDataId:(NSString*)dataId;

#pragma mark ------ 除非你知道底层会拿这个做什么，否则不要重写
// 根据请求参数获取dataId（不含分页参数）
-(NSString*)dataIdOfParams:(NSDictionary*)params;

// 根据dataId反解析出请求参数
-(NSDictionary*)paramsOfDataId:(NSString*)dataId;

// dataId在缓存库中的key
- (NSString*)keyOfPersistentCacheForDataId:(NSString *)dataId;



#pragma mark ------ 写子类Model会用到

#pragma mark 根据需要决定是否重写

/** 此dataId是否支持缓存*/
- (BOOL)bSupportPersistentCache:(NSString*)dataId;

#pragma mark 注意：子类必须重写！！！
// Model对应Item类
- (Class)classOfItem;

#pragma mark 写子类会用到，但UI层不应该使用
// 处理返回数据（注意：这里已经默认处理了支持分页的网络数据接口缓存，故不要写重复了！）
- (BOOL)processServiceSuccRawData:(NSData *)rawData parsedJson:(MFWJson *)jsonObj forTask:(MFWHttpTask *)task;

@end
